package com.wdb.modules.system.domain;

import com.alibaba.fastjson.annotation.JSONField;
import com.baomidou.mybatisplus.annotation.*;
import com.wdb.base.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.FieldDefaults;

import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
import java.util.Objects;
import java.util.Set;

/**
 * @author: wendaobai@qq.com
 * @date: 2024/1/16 0016 15:08
 */
@Data
@TableName("sys_menu")
public class Menu extends BaseEntity implements Serializable {

  @NotNull(groups = {Update.class})
  @TableId(value = "menu_id", type = IdType.AUTO)
  @ApiModelProperty(value = "ID", hidden = true)
  private Long id;

  @TableField(exist = false)
  @JSONField(serialize = false)
  @ApiModelProperty(value = "菜单角色")
  private Set<Role> roles;

  @TableField(exist = false)
  private List<Menu> children;

  @ApiModelProperty(value = "菜单标题")
  private String title;

  @TableField(value = "name")
  @ApiModelProperty(value = "菜单组件名称")
  private String componentName;

  @ApiModelProperty(value = "排序")
  private Integer menuSort = 999;

  @ApiModelProperty(value = "组件路径")
  private String component;

  @ApiModelProperty(value = "路由地址")
  private String path;

  @ApiModelProperty(value = "菜单类型，目录、菜单、按钮")
  private Integer type;

  @ApiModelProperty(value = "权限标识")
  private String permission;

  @ApiModelProperty(value = "菜单图标")
  private String icon;

  @ApiModelProperty(value = "缓存")
  private Boolean cache;

  @ApiModelProperty(value = "是否隐藏")
  private Boolean hidden;

  @ApiModelProperty(value = "上级菜单")
  @TableField(updateStrategy = FieldStrategy.IGNORED)
  private Long pid;

  @ApiModelProperty(value = "子节点数目", hidden = true)
  private Integer subCount = 0;

  @ApiModelProperty(value = "外链菜单")
  private Boolean iFrame;

  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    Menu menu = (Menu) o;
    return Objects.equals(id, menu.id);
  }

  @Override
  public int hashCode() {
    return Objects.hash(id);
  }

  public Boolean getHasChildren() {
    return subCount > 0;
  }

  public Boolean getLeaf() {
    return subCount <= 0;
  }

  public String getLabel() {
    return title;
  }
}
